package DesignPatterns.singleton;

import java.util.concurrent.ConcurrentHashMap;

/**
 * 注册表单例
 * 这是Spring采用的单例模式，其实和静态属性差不多，只是将对象存储到了Map中，利用了Map的键不能重复的原则 实现了值的唯一，从而保证了单例。
 * 优点：线程安全、懒加载、设计新颖（利用Map的键不重复保证了值的唯一）
 * 缺点：高并发下存在多个线程同时创建多个对象的可能，但是不会存在多个实例
 */
public class Single9 {
    private static ConcurrentHashMap<String,Object> hashMap = new ConcurrentHashMap<>();

    public static Object getInstance(String key) throws Exception{
        if(hashMap.get(key) == null){
            hashMap.put(key,Class.forName(key).newInstance());
        }
        return hashMap.get(key);
    }

    // 测试
    public static void main(String[] args) throws Exception{
        for (int i = 0; i < 50; i++) {
            new Thread(()->{
                try {
                    System.out.println(getInstance("DesignPatterns.singleton.Single9"));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}
